#include "database.h"     // 包含自定义的头文件
#include <stdio.h>        // 标准输入输出头文件
#include <stdlib.h>       // 标准库头文件
#include <string.h>       // 字符串操作头文件
#include <errno.h>        // 错误号定义，用于 errno
#include <unistd.h>       // UNIX 标准函数定义，用于 close()
#include <sys/socket.h>   // 套接字编程头文件，用于 send()
#include <arpa/inet.h>    // 网络地址转换头文件，用于 htonl()

// 创建 SQLite 表（如果不存在）
void create_table_if_not_exists(sqlite3 *db)
{
    char *err_msg = 0; // 错误信息指针
    char *sql = "CREATE TABLE IF NOT EXISTS temperature_logs ("
                "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                "data TEXT);"; // SQL 创建表语句

    // 执行 SQL 语句
    int rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "无法创建表: %s\n", err_msg); // 打印错误信息
        sqlite3_free(err_msg); // 释放错误信息内存
    }
}

// 将数据存储到 SQLite 数据库
void store_in_sqlite(sqlite3 *db, const char *data)
{
    const char *insert_sql = "INSERT INTO temperature_logs(data) VALUES(?);"; // SQL 插入语句
    sqlite3_stmt *stmt; // SQLite 语句对象

    // 准备插入语句
    int rc = sqlite3_prepare_v2(db, insert_sql, -1, &stmt, NULL);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "无法准备插入语句: %s\n", sqlite3_errmsg(db)); // 打印错误信息
        return;
    }

    // 绑定参数
    sqlite3_bind_text(stmt, 1, data, -1, SQLITE_STATIC);

    // 执行插入操作
    rc = sqlite3_step(stmt);
    if (rc != SQLITE_DONE)
    {
        fprintf(stderr, "无法插入数据: %s\n", sqlite3_errmsg(db)); // 打印错误信息
    }

    sqlite3_finalize(stmt); // 释放语句对象
}

// 发送数据到服务器
int send_data(int sock, const char *data)
{
    ssize_t bytes_sent = send(sock, data, strlen(data), 0); // 发送数据
    if (bytes_sent < 0)
    {
        if (errno == EPIPE || errno == ECONNRESET)
        {
            fprintf(stderr, "发送数据错误: %s\n", strerror(errno)); // 打印错误信息
            return -1; // 返回错误状态
        }
        else
        {
            fprintf(stderr, "发送数据错误: %s\n", strerror(errno)); // 打印错误信息
            return -1; // 返回错误状态
        }
    }
    else
    {
        printf("已发送 %zd 字节的数据。\n", bytes_sent); // 打印发送的字节数
        return 0; // 返回成功状态
    }
}

// 检查 SQLite 是否有缓存数据
int has_cached_data(sqlite3 *db)
{
    sqlite3_stmt *stmt; // SQLite 语句对象
    const char *sql = "SELECT COUNT(*) FROM temperature_logs;"; // SQL 查询语句
    int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "无法准备查询语句: %s\n", sqlite3_errmsg(db)); // 打印错误信息
        return 0;
    }

    rc = sqlite3_step(stmt);
    if (rc == SQLITE_ROW)
    {
        int count = sqlite3_column_int(stmt, 0); // 获取记录数
        sqlite3_finalize(stmt); // 释放语句对象
        return count > 0 ? 1 : 0; // 返回是否有缓存数据
    }
    else
    {
        fprintf(stderr, "无法执行查询语句: %s\n", sqlite3_errmsg(db)); // 打印错误信息
        sqlite3_finalize(stmt); // 释放语句对象
        return 0;
    }
}

// 发送缓存的 SQLite 数据到服务器（每次发送一条）
void send_cached_data(sqlite3 *db, int sock)
{
    sqlite3_stmt *stmt; // SQLite 语句对象
    const char *sql = "SELECT id, data FROM temperature_logs ORDER BY id ASC LIMIT 1"; // SQL 查询语句，获取一条数据
    int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);

    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "无法检索缓存的数据: %s\n", sqlite3_errmsg(db)); // 打印错误信息
        return;
    }

    // 检查是否有记录
    if (sqlite3_step(stmt) == SQLITE_ROW)
    {
        int id = sqlite3_column_int(stmt, 0); // 获取数据的 ID
        const char *cached_data = (const char*)sqlite3_column_text(stmt, 1); // 获取数据内容

        printf("发送缓存的数据 ID %d: %s\n", id, cached_data); // 打印要发送的数据

        // 发送数据到服务器
        ssize_t bytes_sent = send(sock, cached_data, strlen(cached_data), 0);
        if (bytes_sent < 0)
        {
            fprintf(stderr, "发送缓存的数据错误: %s\n", strerror(errno)); // 打印错误信息
        }
        else
        {
            // 发送成功后删除该记录
            char delete_sql[128];
            snprintf(delete_sql, sizeof(delete_sql), "DELETE FROM temperature_logs WHERE id=%d", id);
            rc = sqlite3_exec(db, delete_sql, 0, 0, NULL);
            if (rc != SQLITE_OK)
            {
                fprintf(stderr, "删除缓存的数据 ID %d 失败: %s\n", id, sqlite3_errmsg(db)); // 打印错误信息
            }
            else
            {
                printf("已删除缓存的数据 ID %d。\n", id); // 打印删除成功信息
            }
        }
    }

    sqlite3_finalize(stmt); // 释放语句对象
}

